home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_100 / 121_01 / files.c < prev    next >
Text File  |  1985-08-19  |  3KB  |  103 lines

  1. /*
  2. HEADER: CUG 121.;
  3.  
  4.     TITLE:    files - functions for ambiguous filenames;
  5.     VERSION:    1.0;
  6.     DATE:    09/01/85;
  7.     DESCRIPTION: "This file contains the following functions used by other
  8.         programs on this disk: (1) filelist converts ambiguous file
  9.         descriptors to unambiguous file descriptors, (2) nameok takes
  10.         an input file descriptor (ambiguous or unambiguous) and
  11.         creates a list of unambiguous file descriptors in the supplied
  12.         table, (3) pickout extracts the name from a CP/M fcb.";
  13.     KEYWORDS:    ambiguous, filenames;
  14.     SYSTEM:    CP/M;
  15.     FILENAME:    FILES.C;
  16.     AUTHORS:    Mike W. Meyer, Cal Thixton;
  17.     COMPILERS:    BDS-C 1.50;
  18. */
  19.  
  20. #include <bdscio.h>
  21. #include "fcb.h"
  22.  
  23. #define    DIRFRST    17
  24. #define    DIRNEXT    18
  25.  
  26. /*
  27.  * filelist - takes a list of afd's in, and returns the
  28.  *    ufd's they generate out.
  29.  *    parms are: in - input list; num - its length;
  30.  *          out - a pointer to a vector of char *'s.
  31.  *          max - maximum number of output filenames.
  32.  *
  33.  *    result - the number of files found (or 0...)
  34.  */
  35. filelist(in, num, out, max) char **in, **out; {
  36.     char f, c, buf[20];
  37.     int count;
  38.     fcb con;
  39.  
  40.     count = 0;
  41.     while (num--)
  42.         {
  43.         setfcb(con, *in++);
  44.         for(f = DIRFRST; (c = bdos(f, &con)) != 255; f = DIRNEXT)
  45.             {
  46.             pickout(0x80 + (c * 32), buf);
  47.             strcpy(buf[count++] = alloc(strlen(buf)) + 1, buf);
  48.             if (count == max)
  49.                 return(max);
  50.             }
  51.         }
  52.     return(count);
  53.     }
  54.  
  55. /*
  56.  * pickout - picks the name out of a cp/m fcb.
  57.  */
  58. pickout(fcon, name) fcb *fcon; char *name; {
  59.     char i;
  60.  
  61.     if (fcon -> f_entry) {
  62.         *name++ = " ABCD"[fcon -> f_entry & 0x7f];
  63.         *name++ = ':';
  64.         }
  65.     for (i = 0; fcon -> f_name[i] != ' ' && i < 8; i++)
  66.         *name++ = fcon -> f_name[i];
  67.     if (fcon -> f_name[8] != ' ')
  68.         {
  69.         *name++ = '.';
  70.         for (i = 8; fcon -> f_name[i] != ' ' && i < 11; i++)
  71.             *name++ = fcon -> f_name[i];
  72.         }
  73.     *name = 0;
  74.     }
  75.  
  76. /*
  77.  * nameok - take an afd or ufd in, create list of ufds in table supplied,
  78.  *    return number of last slot used in table.
  79.  *
  80.  *    parms are: filenum - next position to use in following table
  81.  *           files - ptr to vector of char *'s, containing ufds
  82.  *            with last entry possibly an afd
  83.  *           filemax - maximum number of filenames in table
  84.  *
  85.  *    result - the next available slot in files
  86.  */
  87. nameok(filenum,files,filemax) char filenum, **files; int filemax; {
  88.     char    f,c,o[20];
  89.     fcb    cpmfcb;
  90.  
  91.     filenum--;
  92.     if (!strlen(files[filenum])) 
  93.         return(filemax);
  94.     setfcb(cpmfcb,files[filenum]);
  95.     for (f=DIRFRST; (c=bdos(f,&cpmfcb))!=255 && filenum<filemax; f=DIRNEXT)
  96.         {
  97.         pickout(0x80+(c*32),o);
  98.         files[filenum] = alloc(strlen(o)+1);
  99.         strcpy(files[filenum++],o);
  100.         }
  101.     return(filenum);
  102. }
  103.